﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SoftwareConsulting.BI11.NumericalMethods.NonLinearEquations
{
    /// <summary>
    /// Класс метода половинного деления для решения нелинейный алгебраических уравнений
    /// </summary>
    public class BisectionMethod 
    {
        private double[,] _result;

        /// <summary>
        /// Конструктор класса
        /// </summary>
        /// <param name="function">Функция, требующая решения</param>
        /// <param name="beginPoint">Значение начальной точки интервала</param>
        /// <param name="endPoint">Значение конечной точки интервала</param>
        /// <param name="divisionsCount">Число разбиений</param>
        public BisectionMethod(FunctionWithOneArgument function, double beginPoint, double endPoint, double divisionsCount)
        {
            _result = new double[2,1];
            int t = 0;
            int j = 0;    
            double y = Math.Abs(beginPoint - endPoint);
            while (y > divisionsCount)
            {
                t++;
                double x2 = (beginPoint + endPoint) / 2;
                if (function(beginPoint) * function(x2) > 0)
                    beginPoint = x2;
                else
                    endPoint = x2;
                y = Math.Abs(beginPoint - endPoint);
            }
            _result[0 , j] = endPoint;
            _result[1 , j] = t;
        }
    

        /// <summary>
        /// Возвращает решение
        /// </summary>        
        public double[,] GetSolution()
        {
            return _result;
        }
    }
}
